package com.example.docmanagement.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 认证响应 DTO
 * 用户登录或注册成功后返回的响应数据
 * 包含访问令牌和用户基本信息
 * 
 * 示例 JSON:
 * {
 * "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
 * "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
 * "tokenType": "Bearer",
 * "expiresIn": 86400,
 * "user": {
 * "id": "550e8400-e29b-41d4-a716-446655440000",
 * "email": "user@example.com",
 * "username": "zhangsan",
 * "fullName": "张三",
 * "roleName": "USER"
 * }
 * }
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Schema(description = "认证响应数据（登录/注册成功后返回）")
public class AuthResponse {

    /**
     * 访问令牌（Access Token）
     * JWT格式的访问令牌，用于后续API调用的身份认证
     * 使用方式：在HTTP请求头中添加 "Authorization: Bearer {accessToken}"
     * 有效期：默认24小时（86400秒）
     * 示例："eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ..."
     */
    @Schema(description = "访问令牌(JWT)", example = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...")
    private String accessToken;

    /**
     * 刷新令牌（Refresh Token）
     * 用于在访问令牌过期后获取新的访问令牌
     * 有效期：默认7天
     * 使用方式：调用 /api/v1/auth/refresh 接口并传入此令牌
     * 示例："eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwicmVmcmVzaCI6dHJ1ZSwiaWF0IjoxNTE2MjM5MDIyfQ..."
     */
    @Schema(description = "刷新令牌", example = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...")
    private String refreshToken;

    /**
     * Token类型
     * 固定值："Bearer"
     * 表示这是一个Bearer类型的令牌，需要在HTTP Authorization头中使用
     * 使用格式："Authorization: Bearer {accessToken}"
     */
    @Schema(description = "Token类型", example = "Bearer", defaultValue = "Bearer")
    @Builder.Default
    private String tokenType = "Bearer";

    /**
     * Token过期时间（秒）
     * 访问令牌的有效时长，单位为秒
     * 默认值：86400（24小时）
     * 前端应根据此值计算token过期时间，并在过期前使用refreshToken刷新
     * 示例：86400（表示24小时后过期）
     */
    @Schema(description = "Token过期时间（秒）", example = "86400")
    private Long expiresIn;

    /**
     * 用户基本信息
     * 包含当前登录用户的关键信息
     * 用于前端显示用户信息，避免额外的API调用
     */
    @Schema(description = "用户基本信息")
    private UserInfo user;

    /**
     * 用户信息内部类
     * 包含用户的基本资料
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    @Schema(description = "用户基本信息")
    public static class UserInfo {
        /**
         * 用户ID
         * UUID格式的用户唯一标识符
         * 示例："550e8400-e29b-41d4-a716-446655440000"
         */
        @Schema(description = "用户ID", example = "550e8400-e29b-41d4-a716-446655440000")
        private String id;

        /**
         * 用户邮箱
         * 用户注册时使用的邮箱地址
         * 示例："user@example.com"
         */
        @Schema(description = "用户邮箱", example = "user@example.com")
        private String email;

        /**
         * 用户名
         * 用户的登录名称
         * 示例："zhangsan"
         */
        @Schema(description = "用户名", example = "zhangsan")
        private String username;

        /**
         * 用户全名
         * 用户的真实姓名或昵称
         * 示例："张三"
         */
        @Schema(description = "用户全名", example = "张三")
        private String fullName;

        /**
         * 角色名称
         * 用户在系统中的角色
         * 常见值：
         * - "USER": 普通用户
         * - "ADMIN": 管理员
         * - "EDITOR": 编辑者
         * 示例："USER"
         */
        @Schema(description = "角色名称", example = "USER", allowableValues = { "USER", "ADMIN", "EDITOR" })
        private String roleName;
    }
}
